const http = require('http')

// const server = http.createServer()

// server.on('request', (req, res) => {
//     res.end('hello')
// })

// server.listen(1234, () => {
//     console.log(`server is running at port 1234`)
// })

const express = require('express')

const app = express()

//引入xml2js包
var xml2js = require("xml2js");
//创建xml->js的对象
var parser = new xml2js.Parser({
    explicitArray: false
});
//创建js->xml的对象
var builder = new xml2js.Builder({
    rootName: "xml",
    cdata: true,
    headless: true
});

/**
 * 验证服务器是否有效 同时和微信服务器进行绑定关联
 */
app.get('/', (req, res) => {
    console.log('hello')

    // 返回微信服务器要求的数据进行验证
    res.send(req.query.echostr);
})

/**
 * post请求可以获取到从微信里面发送过来的消息 但是格式是xml 
 * 不能再使用bodypaser进行解析
 * 所有只能使用原生node去解析post的数据
 */
app.post('/', (req, res) => {
    let bufferList = []
    // 使用事件监听的方式获取post的数据 数据是buffer
    req.on('data', (chunk) => {
        bufferList.push(chunk)
    })

    // 监听end事件 获取最终的数据
    req.on('end', () => {
        const buffer = Buffer.concat(bufferList)
        console.log(buffer.toString())
        // 用户发送的数据转换成了xml格式的字符串
        const res_str = buffer.toString()

        // 将xml格式字符串转换成js对象
        parser.parseString(res_str, function (err, result) {
            // result 是转换完毕的js对象
            console.log(result)
            // { xml:
            //     { ToUserName: 'gh_947e73b0684c',
            //       FromUserName: 'o5NRUv5wuWKtLXnYCf0YKeNPOqLQ',
            //       CreateTime: '1524314083',
            //       MsgType: 'text',
            //       Content: '光谷',
            //       MsgId: '6546879135740140725'
            //     }
            // }

            // 将用户发送的数据拼接成图灵机器人需要的数据
            var data = JSON.stringify({
                "key": "db482b8431a4470088449568419df7df",
                "info": result.xml.Content,
                "userid": result.xml.FromUserName
            })

            // 将用户发送的内容发送给图灵机器人
            const request = http.request({
                method: "POST",
                host: "www.tuling123.com",
                protocal: "http://",
                port: "80",
                path: "/openapi/api",
                headers: {
                    "Content-Type": 'application/json',
                    "Content-Length": Buffer.byteLength(data)
                }
            },function(response){
                let bufferList = []
                response.on('data',function(chunk){
                    bufferList.push(chunk)
                })

                response.on('end',function(){
                    const buffer = Buffer.concat(bufferList)
                    const res_str = buffer.toString()
                    // 图灵机器人返回的信息
                    console.log(res_str)
                    const msg = JSON.parse(res_str).text
                    
                    // 组装返回给微信服务器的消息
                    const returnMsg = {
                        ToUserName: result.xml.FromUserName,
                        FromUserName: result.xml.ToUserName,
                        CreateTime: +new Date(),
                        MsgType: "text",
                        Content: msg
                    }

                    //将回复消息对象转换成xml格式的数据，响应给微信服务器
                    res.send(builder.buildObject(returnMsg));
                })
            })

            request.write(data)
        })
    })
})

app.listen(8888, function () {
    console.log("the server is running at port 8888")
})

// 订阅号 -> 微信服务器 -> 自己的服务器(http://zxx.free.ngrok.cc/) -> 图灵机器人服务器(http://www.tuling123.com/openapi/api)